// 通过发布者订阅者模式实现自定义事件
class Event {

    /*
        维护事件名称和事件处理函数的对应关系
        {
            事件名称:[事件处理函数,事件处理函数],
            事件名称:[事件处理函数,事件处理函数]
        }
    */ 
    subs={}

    // 触发自定义事件, 根据事件名称找到事件处理函数, 依次触发
    // eventName: 表示自定义事件名称
    // payload: 表示要发送给事件处理函数的数据
    $emit(eventName,payload){
        if(this.subs[eventName]){
            this.subs[eventName].forEach(handler=>{
                handler(payload);
            });
        }
    }

    // 监听自定义事件, 收集事件名称和事件处理函数
    // eventName: 表示自定义事件名称
    // handler: 事件处理函数
    $on(eventName,handler){
        // 如果该事件被监听过
        if(this.subs[eventName]){
            this.subs[eventName].push(handler);
        }else{
            // 该事件没有被监听过
            this.subs[eventName]=[handler];
        }
    }
}

// 创建实例对象
const event=new Event();
export default event;
